package com.borya.statuscode;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public enum StatusCode {
	/** 200 : success **/
	SUCCESS("200", "success", ""),
	/** 204 : 无内容 **/
	NO_CONTENT("204", "无内容", ""),
	/** 301 : 欠费 **/
	ARREARAGE("301", "欠费", ""),
	/** 302 : 余额不足 **/
	BALANCE_NOT_ENOUGH("302", "余额不足", ""),
	/** 304 : 无修改 **/
	NO_MODIFIED("304", "无修改", ""),
	/** 400 : 请求错误 **/
	REQUEST_ERROR("400", "请求错误", ""),
	/** 401 : 未授权 **/
	UNAUTHORIZED("401", "未授权", ""),
	/** 403 : 未授权(不允许访问) **/
	FORBID("403", "未授权,不允许访问", ""),
	/** 407 : 代理未授权 **/
	PROXY_AUTHENTICATION_REQUIRED("407", "代理未授权", ""),
	/** 408 : 请求超时 **/
	REQUEST_TIMEOUT("408", "请求超时", ""),
	/** 415 : 不支持的媒体类型 **/
	UNSUPPORT_MEDIA_TYPE("415", "不支持的媒体类型", ""),
	/** 500 : 内部服务器错误 **/
	INTERNAL_SERVER_ERROR("500", "内部服务器错误", ""),
	/** 600 : 系统异常 **/
	SYSTEM_EXCEPTION("600", "系统或网络异常", ""),
	/** 601 : 版本不匹配 **/
	VERSION_ERROR("601", "版本不匹配", ""),
	/** 602 : 公司不存在 **/
	COMPANY_NOT_FOUND("602", "公司不存在", ""),
	/** 603 : 公司已存在 **/
	COMPANY_EXISTED("603", "公司已存在", ""), 
	SYSTEM_MANAGER_NOT_PHONE("604",
			"系统管理员木有配置号码", ""),
	/** 605 : XML格式错误 **/
	XML_FORMAT_ERROR("605", "XML格式错误", ""),
	/** 606 : 公司参数错误 **/
	COMPANY_PARAM_ERROR("606", "公司参数错误", ""),
	/** 607 : 参数错误 **/
	PARAM_ERROR("607", "参数错误", ""),
	/** 608 : 参数格式错误 **/
	PARAM_FORMAT_ERROR("608", "参数格式错误", ""),
	/** 609 : admin不可编辑 **/
	FORBID_MODIFY_ADMIN("609", "admin不可编辑", ""),
	/** 611 : 员工不可被修改 **/
	FORBID_MODIFY_STAFF("611", "员工不可被修改", ""),
	/** 612 : 员工不存在 **/
	STAFF_NOT_FOUND("612", "员工不存在", ""),
	/** 613 : 员工已存在 **/
	STAFF_EXISTED("613", "员工已存在", ""),
	/** 614 : 密码不正确 **/
	PASSWORD_ERROR("614", "密码错误", ""), PASSWORD_EQUAL("615", "原密码与新密码不能一致", ""),
	// /**615 : 员工参数错误**/
	// STAFF_PARAM_ERROR("615","员工参数错误",""),
	/** 616 : 员工工号已存在 **/
	STAFFNO_EXISTED("616", "员工工号已存在", ""),
	/** 617 : 授权失败 **/
	AUTHORIZE_FAILED("617", "授权失败", ""),
	/** 618 : 员工工号为空 **/
	STAFFNO_IS_NULL("618", "员工工号为空", ""),
	/** 620 : 员工头像为空 **/
	STAFF_FACE_IS_NULL("620", "员工头像为空", ""),
	/** 622 : 部门不存在 **/
	DEPT_NOT_FOUND("622", "合作公司不存在", ""),
	/** 623 : 部门已存在 **/
	DEPT_EXISTED("623", "合作公司已存在", ""),
	/** 624 : 部门名称为空 **/
	DEPT_NAME_IS_NULL("624", "合作公司名称为空", ""),
	/** 625 : 部门电话格式错误 **/
	DEPT_PHONE_ERROR("625", "合作公司电话格式错误", ""),
	/** 626 : 部门名称格式错误 **/
	DEPT_NAME_ERROR("626", "合作公司名称格式错误", ""),
	/** 627 : 部门传真号码错误 **/
	DEPT_FAX_ERROR("627", "合作公司传真号码错误", ""),
	/** 628 : 公司ID与父部门公司ID不一致 **/
	DEPT_ID_ERROR("628", "公司ID与父部门公司ID不一致", ""),
	/** 629 : 部门名称过长 **/
	DEPT_NAME_LENGTH_ERROR("629", "部门名称过长", ""),
	/** 630 : 部门下存在员工 **/
	DEPT_EXIST_MEMBER("630", "部门下存在员工", ""),
	/** 631 : 不能删除未分组 **/
	FORBID_DEL_UNGROUPED("631", "不能删除未分组", ""),
	/** 638 : 验证码不存在 **/
	CAPTCHE_NOT_FOUND("638", "验证码不存在", ""),
	/** 640 : 父部门不存在 **/
	PARENT_DEPT_NOT_FOUND("640", "父部门不存在", ""),
	/** 641 : 部门参数错误 **/
	DEPT_PARAM_ERROR("641", "部门参数错误", ""),
	/** 642 : 默认部门不能编辑 **/
	FORBID_MODIFY_DEFAULT_DEPT("642", "默认部门不能编辑", ""),
	/** 643 : 部门名称已存在 **/
	DEPT_NAME_EXISTED("643", "合作公司名称已存在", ""),
	/** 644 : 鉴定码错误 **/
	IDENTIFY_CODE_ERROR("644", "鉴定码错误", ""),
	/** 645 : 用户不存在 **/
	USER_NOT_FOUND("645", "用户不存在", ""),
	/** 646 : 用户名已存在 **/
	USERNAME_EXISTED("646", "用户名已存在", ""),
	/** 647 : 用户名或密码错误 **/
	USERNAME_OR_PASSWORD_ERROR("647", "用户名或密码错误", ""),
	/** 648 : session会话失效 **/
	SESSION_OUT_OF_DATE("648", "session会话失效", ""),
	/** 649 : 用户未绑定 **/
	USER_NOT_BINDED("649", "用户未绑定", ""),
	/** 650 : 用户组不存在 **/
	GROUP_NOT_FOUND("650", "用户组不存在", ""),
	/** 651 : 默认用户组不可被修改 **/
	FORBID_MODIFY_DEFAULT_GROUP("651", "默认用户组不可被修改", ""),
	/** 652:用户未登录过手机APP **/
	MEMBER_NEVER_LOGIN("652", "用户未登录过该平台，请先使用手机APP后再操作!", ""),
	/** 670 : 用户XMPP已离线 **/
	OFFLINE("670", "用户XMPP已离线", ""),
	/** 671 : TMSI不匹配 **/
	TMSI_NO_MATCH("671", "TMSI不匹配", ""),
	/** 672 : 用户被踢 **/
	USER_CONFLICT("672", "用户被踢", ""),
	/** tokeng过期 **/
	TOKEN_EXPIRED("674", "用户信息过期", ""),
	/** 700 : 文件不存在 **/
	FILE_NOT_FOUND("700", "文件不存在", ""),
	/** 701 : 上传的是空文件 **/
	FILE_IS_NULL("701", "上传的是空文件", ""),
	/** 712 : 没有上传文件 **/
	NO_FILE_UPLOAD("712", "没有上传文件", ""),
	/** 713 : 照片参数错误 **/
	PHOTO_PARAM_ERROR("713", "照片参数错误", ""),
	/** 714 : 文件参数错误 **/
	FILE_FORMAT_ERROR("714", "文件参数错误", ""),
	/** 715 : 文件大小错误 **/
	FILE_SIZE_ERROR("715", "文件大小错误", ""),
	/** 721 : 包不存在 **/
	PACKAGE_NOT_FOUND("721", "包不存在", ""),
	/** 722 : 无权限 **/
	NO_AUTHORITY("722", "无权限", ""),
	/** 723 : 业务申请不存在 **/
	NO_CONDITION_DEL("723", "业务申请不存在", ""),
	/** 723 : 业务申请已存在 **/
	CONDITION_DEL_ING("724", "业务申请已存在", ""),
	/** 724 : 无位置信息 **/
	ADDRESS_CLOSE("724", "定位未打开", ""),
	/** 725 : 无位置信息 **/
	ADDRESS_NOT_GET("725", "未获取到位置信息", ""),
	/** 740 : 公告不存在 **/
	ANNO_NOT_FOUND("740", "公告不存在", ""),
    /** 748 : 系统繁忙 **/
    SYSTEM_BUSY("748", "系统繁忙，请稍后再试", ""),
	/** 800 : 系统配置错误 **/
	SYSTEM_CONFIG_ERROR("800", "系统配置错误", ""),
	/** 900 : 员工工号已存在 **/
	MEMBER_STAFFNO_EXISTED("900", "员工工号已存在", ""),
	/** 901 : 员工手机号错误 **/
	MEMBER_PHONE_ERROR("901", "手机号错误", ""),
	/** 902 : 员工工作号码错误 **/
	MEMBER_OFFICE_ERROR("902", "员工工作号码错误", ""),
	/** 903 : 管理员删除自己错误 **/
	MEMBER_DELETE_ONESELF_ERROR("903", "管理员删除自己错误", ""),
	/** 904 : admin删除公司管理员错误 **/
	ADMIN_DELETE_MANAGER_ERROR("904", "admin删除公司管理员错误", ""),
	/** 905 : 员工不能挪动自己 **/
	MEMBER_MOVE_ONESELF("905", "员工不能挪动自己", ""),
	/** 906 : 无法挪动公司管理员 **/
	MEMBER_MOVE_MANAGE("906", "无法挪动公司管理员", ""),
	/** 907 : 员工不存在 **/
	// MEMBER_NOT_FOUND("907","员工不存在",""),
	/** 908 : 员工电话号码已存在 **/
	MEMBER_PHONE_EXIST("908", "员工电话号码已存在", ""),
	/** 1001 : XMPP房间不存在 **/
	XMPP_ROOM_NOT_FOUND("1001", "XMPP房间不存在", ""),
	/** 1002 : XMPP房间已存在 **/
	XMPP_ROOM_EXISTED("1002", "XMPP房间已存在", ""),
	/** 1101 : 权限错误 **/
	PERMISSIONPROFILE_IS_NULL("1101", "权限错误", ""),
	/** 1102 : 禁止修改 **/
	FORBID_MODIFY("1102", "禁止修改", ""),
	/** 9010 : 商户未激活 **/
	NO_REGIST_ERR("9010", "商户未激活", ""),
	UPGRADE("2000","当前版本不可用,请更新到最新版本",""),
	
	
	QRCODE_EXPIRED("100500", "二维码过期", ""), DEP_DEALER_ERROR("200150",
			"渠道ID数据错误", ""),

	MEM_WORKNO_ERROR("200250", "workNo错误", ""),
	VERSION_INVAIL("999998", "当前版本已不可用，请更新到最新版本!", ""),
	/** 未知异常 **/
	UNKNOWN("999999", "未知错误", "");
	private String num;
	private String msg;
	private String debugInfo;
	private boolean debugSwitch = false;

	private StatusCode(String num, String msg, String debugInfo) {
		this.num = num;
		this.msg = msg;
		this.debugInfo = debugInfo;
	}

	public String num() {
		return num;
	}

	public String msg() {
		return msg;
	}

	public String debugInfo() {
		return debugInfo;
	}

	public StatusCode debugInfo(String debugInfo) {
		this.debugInfo = debugInfo;
		return this;
	}

	/** 获取Code对象标准的JSON字符串 **/
	public String toJSON() {
		String debugInfo = this.debugInfo;
		if (debugSwitch) {
			this.debugInfo = "";
			return "{\"code\":\"" + num + "\",\"msg\":\"" + msg
					+ "\",\"debugInfo\":\"" + debugInfo + "\"}";
		}
		return "{\"code\":\"" + num + "\",\"msg\":\"" + msg + "\"}";
	}

	/**
	 * 获取Code对象修改默认消息的标准的JSON字符串
	 *
	 * @param msg
	 *            自定义消息
	 **/
	public String toJSON(String msg) {
		String debugInfo = this.debugInfo;
		if (debugSwitch) {
			this.debugInfo = "";
			return "{\"code\":\"" + num + "\",\"msg\":\"" + msg
					+ "\",\"debugInfo\":\"" + debugInfo + "\"}";
		}
		return "{\"code\":\"" + num + "\",\"msg\":\"" + msg + "\"}";
	}

	public String toString() {
		return this.toJSON();
	}

	public String toDiyJson(String attrName, JSONObject jsonObject) {
		String debugInfo = this.debugInfo;
		JSONObject json = new JSONObject();
		json.put("code", num);
		json.put("msg", msg);
		json.put(attrName, jsonObject);
		if (debugSwitch) {
			this.debugInfo = "";
			json.put("debugInfo", debugInfo);
		}
		return json.toJSONString();
	}
	
	/**
	 * 给Code添加新的属性,再返回JSON字符串
	 *
	 * @param attrName
	 *            自定义属性名称
	 * @param value
	 *            自定义属性值,value是JSONObject或者JSON字符串
	 **/
	public String toDiyJson(String attrName, Object value) {
		String debugInfo = this.debugInfo;
		if (debugSwitch) {
			this.debugInfo = "";
			return "{\"code\":\"" + num + "\",\"msg\":\"" + msg
					+ "\",\"debugInfo\":\"" + debugInfo + "\",\"" + attrName
					+ "\":" + value + "}";
		}
		return "{\"code\":\"" + num + "\",\"msg\":\"" + msg + "\",\""
				+ attrName + "\":" + value + "}";
	}

	/**
	 * 给Code添加新的属性,再返回JSON字符串
	 *
	 * @param attrName
	 *            自定义属性名称
	 * @param value
	 *            自定义属性值,value是简单字符串
	 **/
	public String toDiyJson(String attrName, String value) {
		String debugInfo = this.debugInfo;
		if (debugSwitch) {
			this.debugInfo = "";
			return "{\"code\":\"" + num + "\",\"msg\":\"" + msg
					+ "\",\"debugInfo\":\"" + debugInfo + "\",\"" + attrName
					+ "\":\"" + value + "\"}";
		}
		return "{\"code\":\"" + num + "\",\"msg\":\"" + msg + "\",\""
				+ attrName + "\":\"" + value + "\"}";
	}

	/**
	 * 给Code添加新的属性,再返回JSON字符串
	 *
	 * @param isJsonString
	 *            value是否是JSON字符串
	 * @param attrName
	 *            自定义属性名称
	 * @param value
	 *            自定义属性值,value是普通字符串或者JSON字符串
	 **/
	public String toDiyJson(boolean isJsonString, String attrName, String value) {
		String debugInfo = this.debugInfo;
		if (debugSwitch) {
			this.debugInfo = "";
			return "{\"code\":\"" + num + "\",\"msg\":\"" + msg
					+ "\",\"debugInfo\":\"" + debugInfo + "\",\"" + attrName
					+ "\":\"" + value + "\"}";
		}
		if (isJsonString) {
			return "{\"code\":\"" + num + "\",\"msg\":\"" + msg + "\",\""
					+ attrName + "\":" + value + "}";
		} else {
			return "{\"code\":\"" + num + "\",\"msg\":\"" + msg + "\",\""
					+ attrName + "\":\"" + value + "\"}";
		}
	}
	public StatusCode changeMsg(String msg){
		this.msg = msg;
		return this;
	}
	
	public Builder json() {
        return new Builder(num, msg);
    }
    
	public class Builder {
		private JSONObject json = new JSONObject();
		
		public Builder(String code, String msg) {
			json.put("code", code);
			json.put("msg", msg);
		}

		public Builder code(String code) {
			return param("code", code);
		}

		public Builder msg(String msg) {
			return param("msg", msg);
		}

		public Builder data(JSONObject data) {
			return param("data", data);
		}
		
		public String data(String jsonStr) {
			param("data", JSON.parseObject(jsonStr));
			return toString();
		}
		
		public Builder param(String field, Object value) {
			json.put(field, value);
			return this;
		}

		public JSONObject build() {
			return json;
		}

		public String toString() {
			return json.toJSONString();
		}
	}
}